module OMBUFX16 (Z, A);
   output Z;
   input  A;
endmodule

module OMINVX1 (Z, A);
   output Z;
   input  A;
endmodule

module OMOR3X1 (Z, A, B, C);
   output Z;
   input  A;
   input  B;
   input  C;
endmodule

module OMDFFX1 (D, CLK, Q, QB);

input D, CLK;
output Q, QB;
reg Q, QB;

endmodule /* OMDFF */

module top(i1, i2, o1, o2, clk);
  input i1, i2, clk;
  output o1, o2;

  /* Clock tree */
  OMBUFX16  blockA_u1 ( .A(clk), .Z(An1) );
  OMBUFX16  blockA_u2 ( .A(An1), .Z(An2) );
  OMINVX1  blockA_u3 ( .A(An1), .Z(An3) );
  
  /* Sequential */
  OMDFFX1   blockA_ff1 ( .CLK(An2), .D(An5), .Q(An6) );
  OMDFFX1   blockA_ff2 ( .CLK(An3), .D(An7), .Q(o1) );
  
  /* Data path */
  OMBUFX16  blockA_u4 ( .A(i1), .Z(An4) );
  OMOR3X1  blockA_u5 ( .C(An4), .Z(An5) );
  OMBUFX16  blockA_u6 ( .A(An6), .Z(An10) );
  OMBUFX16  blockA_u7 ( .A(An10), .Z(An11) );
  OMBUFX16  blockA_u8 ( .A(An11), .Z(An12) );
  OMBUFX16  blockA_u9 ( .A(An12), .Z(An7) );

  /* Clock tree */
  OMBUFX16  blockB_u1 ( .A(clk), .Z(Bn1) );
  OMBUFX16  blockB_u2 ( .A(Bn1), .Z(Bn2) );
  OMINVX1  blockB_u3 ( .A(Bn1), .Z(Bn3) );
  
  /* Sequential */
  OMDFFX1   blockB_ff1 ( .CLK(Bn2), .D(Bn5), .Q(Bn6) );
  OMDFFX1   blockB_ff2 ( .CLK(Bn3), .D(Bn7), .Q(o2) );
  
  /* Data path */
  OMBUFX16  blockB_u4 ( .A(i2), .Z(Bn4) );
  OMOR3X1  blockB_u5 ( .C(Bn4), .Z(Bn5) );
  OMBUFX16  blockB_u6 ( .A(Bn6), .Z(Bn10) );
  OMBUFX16  blockB_u7 ( .A(Bn10), .Z(Bn11) );
  OMBUFX16  blockB_u8 ( .A(Bn11), .Z(Bn12) );
  OMBUFX16  blockB_u9 ( .A(Bn12), .Z(Bn7) );

  
endmodule

